<?php
/**
 * Created by PhpStorm.
 * User: xiangpeng
 * Date: 2017/1/3
 * Time: 9:31
 */

namespace Home\Controller;


use Common\Model\CategoryModel;
use Common\Model\GoodsAttrModel;
use Common\Model\GoodsModel;
use Common\Model\TypeAttrModel;
use Think\Controller;

class ListController extends Controller
{
    public function index(){
        //1.获得get过来的cid
        $cid = I('get.cid');
        //dd((new CategoryModel())->select());
        //1.2处理面包屑，递归找父级,需要传入数据(data)和(分类id)cid
        $fatherData  = $this->getFather((new CategoryModel())->select(),$cid);
        //dd($fatherData);die;
        //1.4获得到的数据是反序的，需要进行翻转处理   array_reverse将数组翻转
        $fatherData   =  array_reverse($fatherData);
        //分配数据
        $this->assign('fatherData',$fatherData);

        //2.获取筛选规格和属性
        //2.1  调用getSon获取当前分类下的所有子集
        //dd((new CategoryModel())->select());DIE;
        $cids  =  $this->getSon((new CategoryModel())->select(),$cid);
        //将自己压入$cids中
        $cids[] = $cid;
        //2.2获得对应商品gid的数据
        //$gids = (new GoodsModel())->where("cid in (".implode(',',$cids).")")->getField('gid',true);
        $gids  = (new GoodsModel())->where("cid IN (".implode(',',$cids).")")->getField('gid',true);
        //2.3通过$gids来判断当前分类线是否有商品
        if($gids){//当前分类下有商品
            //2.4在商品属性表中获取商品对应的属性值【gtvalue】
            $attrData  = (new GoodsAttrModel())->where("gid IN (".implode(',',$gids).")")->group('gtvalue')->select();
            //dd($attrData);die;
            //2.5重组数组 将taid样的放到一组
            $temp =  [];
            foreach($attrData as $k=>$v){
                $temp[$v['taid']][] =  $v;

            }
            //dd($temp);
            //2.6再次重组数组，获取属性名称
            $finalTmep   = [];
            foreach ($temp as $k=>$v){
                $finalTmep []  =[
                    'name'=> (new TypeAttrModel())->where("taid={$k}")->getField('name'),
                    'value'=>$v,
                ];

            }
            //dd($finalTmep);
            //分配数据
            $this->assign('finalTmep',$finalTmep);
            //2.7筛选0_0_0_0_0_0_0_0  array_fill — 用给定的值填充数组
            $param = isset($_GET['param']) ? explode('_',$_GET['param']) : array_fill(0,count($finalTmep),0);
            //分配数据
            $this->assign('param',$param);
            //2.8进行筛选功能处理
            foreach($param as $k=>$v){
                if($v){  //为真就证明有筛选
                    //根据gtid得到gtvalue
                    $gtvalue = (new GoodsAttrModel())->where("gtid={$v}")->getField('gtvalue');
                    //dd($gtvalue);
                    //根据gtvalue得到商品id
                    $filterGids[]  = (new GoodsAttrModel())->where("gtvalue='{$gtvalue}'")->getField('gid',true);
                }
            }
            //dd($filterGids);DIE;
            if($filterGids){ //为真就是有筛选
                //如果有筛选gids
                $finalGids= $filterGids[0];
                //每一个都与第一个求交集  array_intersect — 计算数组的交集
                foreach($filterGids as $k=>$v){
                    //跟上面的变量名保持一致(83行)
                    $finalGids  = array_intersect($finalGids,$v);
                }
                //这是从商品属性表中拿出来的数据，可能不在该商品的分类下
                //需要分根商品id再求一下交集
                $finalGids  =array_intersect($finalGids,$gids);
            }else{
                //全部都不限的时候，最终的gid就是gids
                $finalGids = $gids;
            }
            //dd($finalGids);DIE;
        }else{//当前分类下没有商品
            $finalGids = [];
        }
        //(".implode(',',$finalGids).")
        //获得用户筛选的商品
        if($finalGids){
            $goodData  = (new GoodsModel())->where("gid in (".implode(',',$finalGids).")")->select();
            //分配数据
            $this->assign('goodData',$goodData);
        }else{
            $goodData = [];
        }
        //dd($goodData);
        //分配头部公共数据
        $conf = [
            'js'=>['list'],
            'css'=>['index']
        ];
        $this->assign('conf',$conf);
        //加载模板
        $this->display();
    }


    /**
     * 1.3
     * 找子集
     * @param $data 数据
     * @param $cid  分类id
     */

    public  function getSon($data,$cid){
            //定义一个静态数据
            static $temp = [];
            //将获得的data数据循环遍历
            foreach($data as $k=>$v){
                //判断$v是否和$cid相等
                if($v['pid']==$cid){
                    //将$v里的cid压入空数组中
                    $temp[] = $v['cid'];
                    //调用子集继续找子集
                    $this->getSon($data,$v['cid']);
                }
            }
            //将数据返回调用处
            return $temp;
    }


    /**
     * 1.3
     * 找父级
     * @param $data 数据
     * @param $cid  分类id
     */

    public  function getFather($data,$cid){
        //定义一个静态空数据
        static $temp  = [];
        //将data数据循环遍历，判断是否与$cid相等
        foreach($data as $k=>$v){
            //当$v的cid与传入的cid相等时，将$v压入$temp中
            if($v['cid']==$cid){
                $temp[]  = $v;
                //调用getFather找他的父级,是根据当前这一条的pid去找当前这个的父级
                $this->getFather($data,$v['pid']);
            }
        }
        //将结果返回到调用处
        return $temp;

    }

}